#!/bin/bash
# 功能：安装 Cockpit 面板

set -euo pipefail
IFS=$'\n\t'

# 加载公共模块，确保依赖函数和常量可用
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
source "${SCRIPT_DIR}/lib/core/constants.sh"
source "${SCRIPT_DIR}/lib/core/logging.sh"
source "${SCRIPT_DIR}/lib/system/dependency.sh"

# 检查 apt、curl、systemctl 依赖，确保后续操作可用
REQUIRED_CMDS=(apt curl systemctl)
if ! check_dependencies "${REQUIRED_CMDS[@]}"; then
  log_error "缺少 apt、curl 或 systemctl，请先手动安装。"
  exit "${ERROR_DEPENDENCY}"
fi

# 读取系统信息，默认 Debian
. /etc/os-release
SYSTEM_NAME="Debian"

# {{ AURA-X: Modify - Debian 系统跳过并禁用 45Drives 源，避免 bookworm 404。Confirmed via 寸止 }}
# 根据 /etc/os-release 判断是否 Debian
if [[ "${ID:-}" == "debian" ]]; then
  log_info "检测到 Debian，跳过 45Drives 源配置，并禁用可能已存在的 45Drives 源。"
  # 禁用 deb822 源文件（/etc/apt/sources.list.d/45drives.sources）
  if [[ -f /etc/apt/sources.list.d/45drives.sources ]]; then
    if grep -qE '^[[:space:]]*Enabled:' /etc/apt/sources.list.d/45drives.sources; then
      sed -i 's/^[[:space:]]*Enabled:.*/Enabled: no/' /etc/apt/sources.list.d/45drives.sources
    else
      sed -i '1i Enabled: no' /etc/apt/sources.list.d/45drives.sources
    fi
    log_info "已禁用 45drives.sources（Enabled: no）。"
  fi
  # 重命名传统 .list 源文件以禁用
  if [[ -f /etc/apt/sources.list.d/45drives.list ]]; then
    mv -f /etc/apt/sources.list.d/45drives.list /etc/apt/sources.list.d/45drives.list.disabled || true
    log_info "已禁用 45drives.list。"
  fi
else
  # 非 Debian 系统，按原逻辑尝试配置 45Drives 源
  log_info "非 Debian 系统，尝试配置 45Drives 软件源..."
  if ! command -v lsb_release >/dev/null; then
    apt install -y lsb-release || { log_error "lsb-release 安装失败。"; exit "${ERROR_DEPENDENCY}"; }
  fi
  if ! curl -sSL https://repo.45drives.com/setup | bash; then
    if [ ! -f /etc/apt/sources.list.d/45drives.sources ]; then
      log_error "45Drives 软件源配置失败。"
      exit "${ERROR_GENERAL}"
    fi
  fi
fi

# 刷新软件包索引
if ! apt update; then
  log_error "软件源更新失败。"
  exit "${ERROR_GENERAL}"
fi

# 安装 Cockpit 及其常用组件，提升系统管理能力
# {{ AURA-X: Modify - 将可选组件独立安装，避免 45Drives 源不可用时整体失败。Confirmed via 寸止 }}
log_info "正在安装 Cockpit 及其组件..."

# 始终优先从 backports 安装核心组件
if ! apt install -y -t ${VERSION_CODENAME}-backports cockpit pcp python3-pcp tuned; then
  log_error "核心组件安装失败（cockpit/pcp/python3-pcp/tuned）。"
  exit "${ERROR_GENERAL}"
fi

# 定义函数：如果候选版本存在则尝试安装，否则跳过
install_if_available() {
  local pkg="$1"
  if apt-cache policy "$pkg" | grep -q "Candidate: (none)"; then
    log_warning "软件包 $pkg 不在当前仓库中，已跳过。"
    return 0
  fi
  if ! apt install -y "$pkg"; then
    log_warning "软件包 $pkg 安装失败，已跳过。"
    return 0
  fi
  return 0
}

# 可选组件（部分来自 45Drives），仅在可用时安装
install_if_available cockpit-navigator
install_if_available cockpit-file-sharing
install_if_available cockpit-identities

# 创建 Cockpit 配置目录
mkdir -p /etc/cockpit

# 写入 Cockpit 配置文件，设置会话超时与登录信息
cat > "/etc/cockpit/cockpit.conf" << 'EOF'
[Session]
IdleTimeout=15
Banner=/etc/cockpit/issue.cockpit

[WebService]
ProtocolHeader = X-Forwarded-Proto
ForwardedForHeader = X-Forwarded-For
LoginTo = false
LoginTitle = HomeNAS
EOF

# 写入 motd 文件，规范登录提示，强化安全意识
cat > "/etc/motd" << 'EOF'
我们信任您已经从系统管理员那里了解了日常注意事项。
总结起来无外乎这三点：
1、尊重别人的隐私；
2、输入前要先考虑（后果和风险）；
3、权力越大，责任越大。
EOF

# 写入 Cockpit 欢迎信息，便于用户识别平台
cat > "/etc/cockpit/issue.cockpit" << EOF
基于${SYSTEM_NAME}搭建 HomeNAS
EOF

# 重启 Cockpit 服务，确保配置生效
if ! systemctl try-restart cockpit; then
  log_error "Cockpit 服务重启失败。"
  exit "${ERROR_GENERAL}"
fi
